package cl.ccs.migracionbcmc.dao.impl;


import cl.ccs.migracionbcmc.connection.ConnectionFactory;
import cl.ccs.migracionbcmc.dao.ConsultaSituacionDao;
import cl.ccs.migracionbcmc.model.Ley;
import cl.ccs.migracionbcmc.model.LeyMonto;
import cl.ccs.migracionbcmc.model.LeyMorosidad;
import cl.ccs.migracionbcmc.model.LeyProtesto;
import cl.ccs.migracionbcmc.util.Util;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Types;

import java.util.ArrayList;
import java.util.List;


public class ConsultaSituacionDaoImpl implements ConsultaSituacionDao {
    public ConsultaSituacionDaoImpl() {
        super();
    }

    /**
     * @param rut
     * @return
     * @throws Exception
     */
    @Override
    public Ley consultaSituacionLey(String rut) throws Exception {
        Connection con = null;
        ResultSet rs = null;
        Ley ley = new Ley();
        List<LeyMorosidad> listMorosidad = new ArrayList<LeyMorosidad>();
        List<LeyProtesto> listProtesto = new ArrayList<LeyProtesto>();
        if (rut == null) {
            return emptyLey();
        }
        try {


            rut = Util.formatRUT(rut);
            con = ConnectionFactory.getConnectionSybaseBIC();
            CallableStatement stm =
                con.prepareCall("{?=CALL SP_Consulta_Ley20575_ADF(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
            stm.registerOutParameter(1, Types.INTEGER);

            stm.setString(2, rut);

            //RESUMEN BIC
            stm.registerOutParameter(3, Types.NUMERIC); //Fld_MontoTotalBic
            stm.registerOutParameter(4, Types.INTEGER); //Fld_CantTotalBic
            stm.registerOutParameter(5, Types.NUMERIC); //Fld_MontoBenefBic
            stm.registerOutParameter(6, Types.INTEGER); //Fld_CantBenefBic

            //RESUMEN MOL
            stm.registerOutParameter(7, Types.NUMERIC); //Fld_MontoTotalMol
            stm.registerOutParameter(8, Types.INTEGER); //Fld_CantTotalMol
            stm.registerOutParameter(9, Types.NUMERIC); //Fld_MontoBenefMol
            stm.registerOutParameter(10, Types.INTEGER); //Fld_CantBenefMol

            //RESUMEN TOTAL
            stm.registerOutParameter(11, Types.NUMERIC); //Fld_TotalDeuda
            stm.registerOutParameter(12, Types.INTEGER); //Fld_CantDeuda
            stm.registerOutParameter(13, Types.NUMERIC); //Fld_TotalBenefDeuda
            stm.registerOutParameter(14, Types.INTEGER); //Fld_CantBenefDeuda

            stm.registerOutParameter(15, Types.BIT); //Fld_FlagBeneficiado
            stm.registerOutParameter(16, Types.VARCHAR); //Fld_Glosa

            stm.execute();
            LeyMonto leyMonto = new LeyMonto();

            //RESUMEN BIC
            leyMonto.setMontoTotal(stm.getDouble(3));
            leyMonto.setCantidadTotal(stm.getInt(4));
            leyMonto.setMontoBeneficiado(stm.getDouble(5));
            leyMonto.setCantidadBeneficiado(stm.getInt(6));

            ley.setLeyMontoBic(leyMonto);

            //RESUMEN MOL
            leyMonto = new LeyMonto();
            leyMonto.setMontoTotal(stm.getDouble(7));
            leyMonto.setCantidadTotal(stm.getInt(8));
            leyMonto.setMontoBeneficiado(stm.getDouble(9));
            leyMonto.setCantidadBeneficiado(stm.getInt(10));

            ley.setLeyMontoMol(leyMonto);

            //MONTO TOTAL
            leyMonto = new LeyMonto();
            leyMonto.setMontoTotal(stm.getDouble(11));
            leyMonto.setCantidadTotal(stm.getInt(12));
            leyMonto.setMontoBeneficiado(stm.getDouble(13));
            leyMonto.setCantidadBeneficiado(stm.getInt(14));

            ley.setLeyMontoTotal(leyMonto);

            ley.setEstado(stm.getString(16));


            //OBTIENE LISTA PROTESTOS
            stm = con.prepareCall("{?=CALL SP_Protestos_Ley20575_ADF( ? )}");
            stm.registerOutParameter(1, Types.INTEGER);

            stm.setString(2, rut);
            rs = stm.executeQuery();
            listProtesto = getLeyProtesto(rs);

            //OBTIENE LISTA MOROSIDAD
            stm = con.prepareCall("{?=CALL SP_Morosidad_Ley20575_ADF( ? )}");
            stm.registerOutParameter(1, Types.INTEGER);

            stm.setString(2, rut);
            rs = stm.executeQuery();
            listMorosidad = getLeyMorosidad(rs);


            ley.setLeyMorosidad(listMorosidad);
            ley.setLeyProtesto(listProtesto);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionFactory.freeConnection(con, rs);
        }
        return ley;
    }

    private List<LeyMorosidad> getLeyMorosidad(ResultSet rs) throws Exception {
        List<LeyMorosidad> listMorosidad = new ArrayList<LeyMorosidad>();

        while (rs.next()) {
            LeyMorosidad morosidad = new LeyMorosidad();

            morosidad.setCuoTipoDocu(rs.getString("Cuo_TipoDocu"));
            morosidad.setCuoMoneda(rs.getString("Cuo_Moneda"));
            morosidad.setCuoMonto(rs.getDouble("Cuo_Monto"));
            if (!Util.isBlankDate(rs.getDate("Cuo_FecVenc"))) {
                morosidad.setCuoFecVenc(rs.getDate("Cuo_FecVenc"));
            }
            morosidad.setCuoTipoRelacion(rs.getString("Cuo_TipoRelacion"));
            morosidad.setCuoTipoInfo(rs.getString("Cuo_TipoInfo"));
            morosidad.setCuoRutRel(rs.getString("Cuo_RutRel"));
            morosidad.setCuoCodCliente(rs.getString("Cuo_CodCliente"));

            listMorosidad.add(morosidad);
        }
        return listMorosidad;
    }

    private List<LeyProtesto> getLeyProtesto(ResultSet rs) throws Exception {
        List<LeyProtesto> listProtesto = new ArrayList<LeyProtesto>();

        while (rs.next()) {
            LeyProtesto protesto = new LeyProtesto();

            protesto.setCorrProt(rs.getDouble("Fld_CorrProt"));
            protesto.setRutAfectado(rs.getString("Fld_RutAfectado"));
            protesto.setTipoDocumento(rs.getString("Fld_TipoDocumento"));
            protesto.setCodMoneda(rs.getInt("Fld_CodMoneda"));
            protesto.setGlosaCorta(rs.getString("Fld_GlosaCorta"));
            protesto.setMontoProt(rs.getDouble("Fld_MontoProt"));

            if (!Util.isBlankDate(rs.getDate("Fld_FecProt"))) {
                protesto.setFecProt(rs.getDate("Fld_FecProt"));
            }
            if (!Util.isBlankDate(rs.getDate("Fld_FecProt"))) {
                protesto.setFecVcto(rs.getDate("Fld_FecProt"));
            }

            protesto.setTipoEmisor(rs.getString("Fld_TipoEmisor"));
            protesto.setCodEmisor(rs.getString("Fld_CodEmisor"));

            listProtesto.add(protesto);
        }
        return listProtesto;
    }


    private Ley emptyLey() {
        Ley ley = new Ley();
        LeyMonto leyMonto = new LeyMonto();
        ley.setLeyMontoBic(leyMonto);
        ley.setLeyMontoMol(leyMonto);
        ley.setLeyMontoTotal(leyMonto);
        return ley;
    }
}
